/**
 * DataHelper类:负责处理本地 localStorage数据的操作
 */

class DataHelper {
  dataKey: string;
  primaryKey: string;

  // 一、构造函数 --作用：为对象 添加 各种属性--------------------------
  constructor(dataKey: string, primaryKey: string) {
    this.dataKey = dataKey;
    this.primaryKey = primaryKey;
  }

  // 方法
  // 1.读取全部数据 ，返回数组(如果没有读取到数组，就返回空数组)
  readData(): any {
    //1.先读取本地数据(是字符串格式)
    let readString: string | null = localStorage.getItem(this.dataKey);
    //2. 转成数组格式
    let readArr: any = [];
    if (readString != null) {
      readArr = JSON.parse(readString);
    }
    //3.返回数组对象
    return readArr;
  }

  //2.存入本地数据
  saveData(arrData: object[]): void {
    //1.将数组 转成 json字符串
    let str: string = JSON.stringify(arrData);

    //2.将字符串 保存到 本地 localStorage 中
    localStorage.setItem(this.dataKey, str);
  }

  //3.新增数据
  addData(newDataObj: any): number {
    // 1:现获取本地的数据
    let dataArr = this.readData();
    if (dataArr == null) {
      dataArr = [];
    }
    //2：自动生成主键id
    let newId =
      dataArr.length > 0 ? dataArr[dataArr.length - 1][this.primaryKey]-0 + 1 : 1;

    newDataObj[this.primaryKey] = newId;
    // 3: 将添加了 主键值 的 对象 追加到数组
    dataArr.push(newDataObj);

    //4:将数组保存到本地
    this.saveData(dataArr);

    //5: 返回添加了 id 的数据对象
    return newId;
  }

  // 4.删除数据
  removeDataById(id: string | number): boolean {
    // 1:先获取本地数据
    let localData = this.readData();
    // 2:根据id 查找具体的某条数据 ，
    let index: number = localData.findIndex((item: any) => {
      return item[this.primaryKey] == id;
    });

    // 如果下标 大于-1，则删除数组中该下标元素对象，并返回true
    if (index > -1) {
      // 3:删除它;
      localData.splice(index, 1);
      // 4: 在保存删除后的数据
      this.saveData(localData);
      return true;
    }

    return false; // 否则 返回 false
  }
}

export default DataHelper;
